package com.ktjy.controller;

import com.ktjy.entity.SysRole;
import com.ktjy.entity.SysUser;
import com.ktjy.service.SysRoleService;
import com.ktjy.service.SysUserService;
import com.ktjy.service.UploadService;
import com.ktjy.utils.Constants;
import com.ktjy.utils.Page;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;

/**
 * 用户模块的控制器类
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-19 - 10:48
 */
@Controller  // 标识当前类为控制类
@RequestMapping("/main/user") // http://localhost:8080/ktsms/main/user
public class SysUserController extends BaseController{

    private Logger LOGGER = LoggerFactory.getLogger(SysUserController.class);

    // 注入两个接口实现类依赖对象
    @Autowired // 按SysUserService类型到spring容器查找此接口实现类对象，找到后进行依赖注入
    private SysUserService sysUserService; // = new SysUserServiceImpl();
    @Autowired
    private SysRoleService sysRoleService; // = new SysRoleServiceImpl();

    /**
     * 按条件并分页显示用户列表数据
     * @param model
     * @param condition 查询条件
     * @param pageNo 当前页码
     * @param pageSize 每页显示的数据行数
     * @return
     */
    @RequestMapping("/page") // 如果不写@GetMapping()或@PostMapping()
    public String page(Model model, SysUser condition,
                       @RequestParam(value = "pageNo", defaultValue = "1")Integer pageNo,
                       @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize){
        try {
            // 查询用户列表的分页数据
            Page<SysUser> page = sysUserService.findPage(condition, pageNo, pageSize);
            // 查询所有的角色列表
            List<SysRole> roleList = sysRoleService.findAll();
            // Page对象和角色列表保存到Mode对象中
            model.addAttribute("pageInfo", page);
            model.addAttribute("roleList", roleList);
            model.addAttribute("condition", condition);
        }catch (Exception e){
            LOGGER.error("SysUserController中的page()方法执行错误：",e);
            e.printStackTrace();
        }
        return "user/page"; // 返回用户列表页面的逻辑视图名
    }

    // 注入文件上传的service接口实现类
    @Autowired
    @Qualifier("toLocalUploadService")
    private UploadService uploadService;

    // 1、跳转到用户的新增页面
    @GetMapping("/save")
    public String toSave(Model model) {
        // 声明一个角色列表集合
        List<SysRole> roleList = null;
        try {
            // 1、调用service中的查询角色列表的方法
            roleList = sysRoleService.findAll();
            // 2、将角色列表保存到model对象中
            model.addAttribute("roleList", roleList);
            // 3、再保存一个空的用户对象
            model.addAttribute("sysUser", new SysUser());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return "user/save";  // 返回用户的新增页面
    }
    // 2、保存新增的用户信息
    // @RequestParam("idPic")接收从save.jsp提交过来的工作照图书文件
    @PostMapping("/save")
    public String doSave(SysUser sysUser,
                         @RequestParam("idPic") MultipartFile idPic,
                         @RequestParam("workPic") MultipartFile workPic){

        // 1、允许的上传文件扩展名
        String [] allowImageExt = {"jpg", "jpeg", "png", "gif", "bmp"};
        try {
            if (idPic != null) {
                // 2、上传证件照
                String idPicPath = uploadService.uploadFile(idPic, allowImageExt);
                // 3、将证件照的图片地址保存到SysUser用户对象中
                sysUser.setIdPicPath(idPicPath);
            }

            if (workPic != null) {
                // 2、上传工作照
                String workPicPath = uploadService.uploadFile(workPic, allowImageExt);
                // 3、将证件照的图片地址保存到SysUser用户对象中
                sysUser.setWorkPicPath(workPicPath);
            }
            // 获取登录成功后，保存到session中的用户对象
            SysUser loginUser = session(Constants.SESSION_USER);
            if (sysUser.getId() == null) {  // 说明新增
                sysUser.setCreatedUserId(loginUser.getId()); // 创建者id
                sysUser.setCreatedTime(new Date());  // 创建时间
            } else {  // 更新操作
                sysUser.setUpdatedUserId(loginUser.getId()); // 更新者id
                sysUser.setUpdatedTime(new Date());  // 更新时间
            }
            // 调用service中的saveOrUpdate()方法进行新增和修改用户信息
            if (sysUserService.saveOrUpdate(sysUser)) {
                // 说明新增或者修改成功，跳转到用户列表页面
                return redirect("/main/user/page");
            }
        }catch (Exception e){
            e.printStackTrace();
            LOGGER.error("执行SysUserController中的doSave()方法发生错误，", e);
        }
        return "user/save"; // 跳转到用户新增页面
    }
    // 采用的REST风格从页面上传递的用户id
    // http://localhost:8080/ktsms/main/user/view/116
    @GetMapping("/view/{id}")
    // @PathVariable("id") 获取{id}所匹配的id
    public String view(Model model, @PathVariable("id") Integer id){
        SysUser sysUser = null;
        try {
            // 调用service中的findById()方法，实现通过id查询用户详情信息
            sysUser = sysUserService.findById(id);
            // 2、将查询到的用户信息保存到model对象中
            model.addAttribute("sysUser", sysUser);
        } catch (Exception e) {
            LOGGER.error("执行SysUserContorller中的view方法发生错误：", e);
            e.printStackTrace();
        }
        // 最后再跳转到用户详情页面
        return "user/view";
    }

    /** 查询用户信息并跳转修改页（共用save.jsp) */
    @GetMapping("/edit")
    public String toEdit(@RequestParam("id") Integer id, Model model){
        SysUser sysUser = null;
        List<SysRole> roleList = null;
        try {
            sysUser = sysUserService.findById(id);
            roleList = sysRoleService.findAll();
            // 有角色下拉框需要数据
            model.addAttribute("roleList", roleList);
            // 回显数据时需要sysUser，这里给个空对象避免出错
            model.addAttribute("sysUser", sysUser);
        } catch (Exception e) {
            LOGGER.error("SysUserController中的toEdit方法执行发生错误。", e);
            throw new RuntimeException(e);
        }
        return "user/save";
    }



}
